package com.study.d5_set;

public class Test {
    public static void main(String[] args) {
        //哈希值：java中所有对象都可以调用object提供的hashcode方法获得该对象哈希值
        //同一对象hash值相同
        //不同对象hash一般不同，但也可能相同（哈希碰撞）

        //哈希表是一种增删改查数据性能都较好的结构

        //JDK8之前HashSet底层，基于哈希表：数组加链表
        //创建默认长度16数组，默认加载因子0.75，数组名table，16*0.75=12,当沾满12个位置，则长度自动扩容成2倍
        //使用哈希值对数组长度做运算计算出存入的位置
        //如果当前位置为null，直接存入
        //不为null，则表示有元素，用equals判断，相等，不存，不等，则存入数组
            //JDK8之前 新元素存入数组，占老元素位置，老元素挂下面
            //JDK8之后，新元素直接挂在老元素下面

        //JDK8之后，链表长度超过8 数组长度>=64,自动将链表转成红黑树
        //红黑树：就是可以自平衡的二叉树，是一种增删改查性能很好的结构


        //LinkedHashSet
        //依然基于哈希表（数组、链表、红黑树）实现
        //但是，每个元素额外多了一个双链表的机制记录他前后元素的位置

        //TreeSet
        //底层基于红黑树
    }
}
